package slice

import (
	"fmt"
)

func testSlice() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Println("arr[2:6]=", arr[2:6]) // 前包后不包
	fmt.Println("arr[:6]=", arr[:6])
	s1 := arr[2:]
	fmt.Println("s1=", s1)
	s2 := arr[:]
	fmt.Println("s2=", s2)
	fmt.Println("After updateSlice(s1)")
	updateSlice(s1)
	fmt.Println(s1)  // [100 3 4 5 6 7]
	fmt.Println(arr) // [0 1 100 3 4 5 6 7]
	fmt.Println("After updateSlice(s2)")
	updateSlice(s2)
	fmt.Println(s2)
	fmt.Println(arr)

	fmt.Println("Reslice")
	fmt.Println(s2)
	s2 = s2[:5]
	fmt.Println(s2)
	s2 = s2[2:]
	fmt.Println(s2)

}

func extendingSlice() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Println(arr)
	s1 := arr[2:6] // [2 3 4 5]
	s2 := s1[3:5]  // [5 6] [s1[3], s1[4]]
	//  cap capacity 容量
	fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2, len(s2), cap(s2))

}

func updateSlice(s []int) {
	// slice是原本数组的视图，即为对数组部分的直接操作
	// []里无数字是切片，切片相当于数组的视图
	// 函数传递进来一个切片
	s[0] = 100
}

func printArraySlice(arr []int) {
	arr[0] = 100
	for i, v := range arr {
		fmt.Println(i, v)
	}
}

func appendSlice() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	s1 := arr[2:6]
	s2 := s1[3:5]
	s3 := append(s2, 10)
	s4 := append(s3, 11) // view 一个新arr len超过caps，系统会自动分配一个新数组，caps翻倍
	s5 := append(s4, 12) // view 一个新arr
	fmt.Println(s3, s4, s5, arr)
}

func main() {
	//testSlice()
	//arr1 := [...]int{2, 4, 6, 8, 10}
	//printArraySlice(arr1[:])
	//fmt.Println(arr1)
	//extendingSlice()
	appendSlice()
}
